/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package polybook;

import java.io.IOException;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import polybook.model.Network;
import polybook.model.NetworkTabLinked;
import polybook.view.*;

/**
 * Programme principal, crer et génère le réseau.
 * @author epulapp
 */
public class MainController extends JFrame {

    // Singleton
    private static MainController instance;
    private BaseView baseView;

    public static MainController getInstance() {
        if (instance == null) {
            return new MainController();
        }
        return instance;
    }
    // Network attaché au singleton
    protected Network currentNetwork;
    // View stuff
    protected static final String title = "Poly+";
    protected JPanel currentView;
    protected JTable currentTable;
    
    /**
     * Constructeur par défaut.
     */
    @SuppressWarnings("LeakingThisInConstructor")
    public MainController() {
        super();
        instance = this;

        // Parametres JFrame
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        } catch (Exception e) {
            System.out.println("UIManager Exception : " + e);
        }
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);



        // Definition de la vue
        this.baseView = new BaseView();
        setCurrentView(this.baseView);

        setVisible(true);
        pack();
    }
    
    
    /**
     * Méthode principale déclenché lors de l'exécution du programme.
     * @param args
     * @throws SQLException
     * @throws IOException
     * @throws Exception 
     */
    public static void main(String[] args) throws SQLException, IOException, Exception {
        // Initialisation du controlleur principal
        MainController.getInstance();
    }
    
    /**
     * Redéfini la vue courante.
     * @param view 
     */
    public void setCurrentView(NamedJPanel view) {
        if (this.currentView != null) {
            this.currentView.setVisible(false);
            this.remove(this.currentView);
        }
        this.currentView = view;
        this.add((JPanel) this.currentView);
        this.setTitle(MainController.title + " - " + view.getTitle());
    }
    
    /**
     * Quitte le programme.
     */
    public void exit() {
        dispose();
        System.exit(0);
    }
    
    /**
     * Return le réseau courant.
     * @return 
     */
    public Network getCurrentNetwork() {
        return currentNetwork;
    }
    
    /**
     * Redéfini le réseau courant.
     * @param currentNetwork  
     */
    public void setCurrentNetwork(Network currentNetwork) {
        this.currentNetwork = currentNetwork;
    }
    
    /**
     * Retourne la JTable de person.
     * @return 
     */
    public JTable getCurrentTable() {
        return currentTable;
    }
    
    /**
     * Défini le tableau de personne à mettre dans la JTable.
     * @param currentTable 
     */
    public void setCurrentTable(JTable currentTable) {
        this.currentTable = currentTable;
    }
    
    /**
     * Défini le vue courante.
     * @param bv 
     */
    public void setCurrentBaseView(BaseView bv) {
        this.baseView = bv;
    }
    
    /**
     * Return la vue courante.
     * @return 
     */
    public BaseView getBaseView() {
        return baseView;
    }
    
    /**
     * Lock la fenêtre principale. 
     */
    public void lockWindow() {
        this.setEnabled(false);
    }
    
    /**
     * Unlock la fenêtre principale. 
     */
    public void unlockWindow() {
        this.setEnabled(true);
    }
}
